package socks;

/**
Exception thrown by various socks classes to indicate errors
with protocol or unsuccessfull server responses.
 */
public class SocksException extends java.io.IOException
{

    /**
    Construct a SocksException with given errorcode.
    <p>
    Tries to look up message which corresponds to this error code.
    @param errCode Error code for this exception.
     */
    public SocksException(int errCode)
    {
        this.errCode = errCode;
        if ((errCode >> 16) == 0)
        {
            //Server reply error message
            errString = errCode <= serverReplyMessage.length
                ? serverReplyMessage[errCode]
                : UNASSIGNED_ERROR_MESSAGE;
        }
        else
        {
            //Local error
            errCode = (errCode >> 16) - 1;
            errString = errCode <= localErrorMessage.length
                ? localErrorMessage[errCode]
                : UNASSIGNED_ERROR_MESSAGE;
        }
    }

    /**
    Constructs a SocksException with given error code and message.
    @param errCode  Error code.
    @param errString Error Message.
     */
    public SocksException(int errCode, String errString)
    {
        this.errCode = errCode;
        this.errString = errString;
    }

    /**
    Get the error code associated with this exception.
    @return Error code associated with this exception.
     */
    public int getErrorCode()
    {
        return errCode;
    }

    /**
    Get human readable representation of this exception.
    @return String represntation of this exception.
     */
    @Override
    public String toString()
    {
        return errString;
    }
    static final String UNASSIGNED_ERROR_MESSAGE = "Unknown error message";
    static final String serverReplyMessage[] =
    {
        "Succeeded",
        "General SOCKS server failure",
        "Connection not allowed by ruleset",
        "Network unreachable",
        "Host unreachable",
        "Connection refused",
        "TTL expired",
        "Command not supported",
        "Address type not supported"
    };
    static final String localErrorMessage[] =
    {
        "SOCKS server not specified",
        "Unable to contact SOCKS server",
        "IO error",
        "None of Authentication methods are supported",
        "Authentication failed",
        "General SOCKS fault"
    };
    String errString;
    int errCode;
}//End of SocksException class

